package org.layui.shop.controller;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletResponse;
import org.layui.shop.vo.PageVo;
import org.layui.shop.vo.ResponseData;

import java.io.IOException;
import java.io.PrintWriter;

/**
 * 所有 Servlet 的父类 - 提取子类公共代码 - 实现代码的复用（维护性也提高了）
 *
 * @author ZQX
 * @date 2024-12-13
 */
public class BaseController extends HttpServlet {


    /**
     * 默认日期格式
     */
    public static final String PARENT_DEFAULT = "yyyy-MM-dd hh:mm:ss";

    /**
     * 年、月、日
     */
    public static final String PARENT_YEAR_MONTH_DATE = "yyyy-MM-dd";

    /**
     * 成功响应 - JSON
     *
     * @param code 状态码
     * @param data 数据
     * @param msg  消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String success(int code,
                             Object data,
                             String msg) {
        ResponseData responseData =
                new ResponseData(code, data, msg);

        return toJson(responseData);
    }


    protected String success(Object data, String msg) {
        ResponseData responseData =
                new ResponseData(200, data, msg);

        return toJson(responseData);
    }

    protected String success(int code,
                             Object data) {
        ResponseData responseData =
                new ResponseData(code, data, null);

        return toJson(responseData);
    }

    /**
     * 成功响应 - JSON - 服务于 Layui 动态表格
     *
     * @param data  响应数据
     * @param count 总记录数
     * @return PageVo 对象的 JSON 字符串
     */
    protected String success(Object data, long count) {
        PageVo pageVo =
                new PageVo(0, data, count);

        return toJson(pageVo);
    }


    /**
     * 错误的响应
     *
     * @param code 状态码
     * @param msg  错误消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String error(int code, String msg) {
        ResponseData responseData =
                new ResponseData(code, null, msg);
        return toJson(responseData);
    }

    /**
     * 错误的响应 - 错误状态码默认为 500
     *
     * @param msg 错误消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String error(String msg) {
        ResponseData responseData =
                new ResponseData(500, null, msg);
        return toJson(responseData);
    }

    /**
     * 把 ResponseData 对象 （响应对象） - 序列化为 JSON 字符串返回
     *
     * @param responseData 响应对象
     * @return JSON字符串
     */
    private String toJson(ResponseData responseData) {
        Gson gson = new GsonBuilder()
                .setDateFormat(PARENT_DEFAULT)
                .create();
        return gson.toJson(responseData);
    }

    /**
     * 把 ResponseData 对象 （响应对象） - 序列化为 JSON 字符串返回
     *
     * @param responseData 响应对象
     * @param pattern      设置日期时间格式
     * @return JSON字符串
     */
    private String toJson(ResponseData responseData, String pattern) {
        Gson gson = new GsonBuilder()
                .setDateFormat(pattern)
                .create();
        return gson.toJson(responseData);
    }


    /**
     * 响应 JSON 字符串到客户端浏览器中
     *
     * @param res 响应对象
     * @param json JSON 字符串
     */
    protected void print(HttpServletResponse res, String json)
            throws IOException {
        res.setCharacterEncoding("UTF-8");
        res.setContentType("application/json;charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.print(json);
        out.flush();
        out.close();
    }
}
